home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_03_02 / 3n02066a < prev    next >
Text File  |  1991-12-17  |  2KB  |  97 lines

  1.  
  2. const
  3.     BITS_PER_SET = 30;
  4.     BITS_PER_BYTE = 8;
  5.     BYTES_PER_SET = (BITS_PER_SET + BITS_PER_BYTE - 1)
  6.         div BITS_PER_BYTE;
  7. type
  8.     bitset = array [0 .. BYTES_PER_SET] of byte;
  9.  
  10. {*
  11.  * Empty set s.  This is equivalent to s := [];
  12.  *}
  13. procedure empty(var s : bitset);
  14.     var
  15.         i : integer;
  16.     begin
  17.     for i := 0 to sizeof(s) - 1 do
  18.         s[i] := 0;
  19.     end;
  20.  
  21. {*
  22.  * Add element e to set s.  This is equivalent to
  23.  * s := s + [e];
  24.  *}
  25. procedure incl(var s : bitset; e : integer);
  26.     var
  27.         bitpos, offset : integer;
  28.         mask : byte;
  29.     begin
  30.     offset := e div BITS_PER_BYTE;
  31.     bitpos := e mod BITS_PER_BYTE;
  32.     mask := 1 shl bitpos;
  33.     s[offset] := s[offset] or mask;
  34.     end;
  35.  
  36. {*
  37.  * Return TRUE if e is an element of set s.  This is
  38.  * equivalent to (e in s).  This version assumes that
  39.  * BITS_PER_BYTE is 8 so it can generate slightly
  40.  * better code.
  41.  *}
  42. function member(e : integer; var s : bitset) :
  43. boolean;
  44.     var
  45.         bitpos, offset : integer;
  46.         mask : byte;
  47.     begin
  48.     offset := e shr 3;
  49.     bitpos := e and 7;
  50.     mask := 1 shl bitpos;
  51.     member := (s[offset] and mask) <> 0;
  52.     end;
  53.  
  54. {*
  55.  * Intersect sets s1 and s2, and store the result in
  56.  * s1.  This is equivalent to s1 := s2 * s2;
  57.  *}
  58. procedure intersect(var s1, s2 : bitset);
  59.     var
  60.         i : integer;
  61.     begin
  62.     for i := 0 to sizeof(s1) - 1 do
  63.         s1[i] := s1[i] and s2[i];
  64.     end;
  65.  
  66. {*
  67.  * Display a set as a series of bytes (in decimal).
  68.  *}
  69. procedure display(var s : bitset);
  70.     var
  71.         i : integer;
  72.     begin
  73.     for i := 0 to sizeof(s) - 1 do
  74.         write(s[i]:2, ' ');
  75.     writeln;
  76.     end;
  77.  
  78. var
  79.     s1, s2 : bitset;
  80.     i : integer;
  81. begin
  82. empty(s1);
  83. write('s1 = '); display(s1);
  84. incl(s1, 10);
  85. incl(s1, 25);
  86. write('s1 = '); display(s1);
  87. for i := 0 to BITS_PER_SET do
  88.     if member(i, s1) then
  89.         writeln(i, ' is a member of s1');
  90. empty(s2);
  91. incl(s2, 11);
  92. incl(s2, 25);
  93. write('s2 = '); display(s2);
  94. intersect(s1, s2);
  95. write('s1 = '); display(s1);
  96. end.
  97.